package com.maimao.model.es.anno;

import com.maimao.model.es.EsSearchConvert;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.function.Function;

import static org.apache.logging.log4j.util.Strings.EMPTY;

/**
 * 标识ES查询字段
 *
 * @author MaoLin Wang
 * @date 2021/4/27 下午5:04
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface EsSearchFiled {

    /**
     * @return ES字段名称
     */
    String fieldName();

    /**
     * 是否为范围查询 如果是范围查询，则在实体类中，请严格将左值放在右值前边，并且必须有左右值
     *
     * @return 默认false
     */
    boolean isRangeQuery() default false;

    /**
     * 范围查询时，是否只有左值
     * @return
     */
    boolean rangeLeft() default false;

    /**
     * 范围查询时 是否只有右值
     * @return
     */
    boolean rangeRight() default false;

    /**
     * 范围查询时，左区间是否打开 (
     *
     * @return 默认闭区间 [
     */
    boolean rangeLeftOpen() default false;

    /**
     * 范围查询时，右区间是否打开 )
     *
     * @return 默认闭区间
     */
    boolean rangeRightOpen() default false;

    /**
     * 是否为嵌套查询，如果是嵌套查询，默认应用其他查询配置【如:如果isRangeQuery=true,则嵌套查询中使用范围查询】
     *
     * @return 默认false
     */
    boolean nested() default false;

    /**
     * 嵌套查询路径
     *
     * @return 没有默认值，嵌套查询不传则抛异常
     */
    String nestedPath() default EMPTY;

    /**
     * 嵌套查询时的scoreMode 取值参考:org.apache.lucene.search.join.ScoreMode的枚举值
     *
     * @return 默认avg
     */
    String nestedScoreMode() default "avg";

    /**
     * 嵌套查询为true时生效:嵌套查询中是否为bool查询
     *
     * @return true: ** 嵌套查询中应用bool查询，这里bool查询默认全部为must【尚未适配should】**
     */
    boolean nestedBool() default false;

    /**
     * 是否匹配查询
     *
     * @return 默认false
     */
    boolean matchQuery() default false;

    /**
     * 范围查询时，是否为And操作符 如：QueryBuilders.matchQuery("key", key).operator(Operator.AND)
     *
     * @return 默认false, 即默认为OR操作符
     */
    boolean matchOperatorAnd() default false;


    /**
     * 值转换器 【仅term查询有效】
     *
     * @return Class<? extends EsSearchConvert>
     */
    Class<? extends EsSearchConvert> valueConvert() default EsSearchConvert.DefaultEsSearchConvert.class;


}
